home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_guile.idb / usr / freeware / include / libguile / random.h.z / random.h
Encoding:
C/C++ Source or Header  |  2002-07-08  |  4.7 KB  |  140 lines

  1. /* classes: h_files */
  2.  
  3. #ifndef RANDOMH
  4. #define RANDOMH
  5. /*    Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
  6.  * 
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2, or (at your option)
  10.  * any later version.
  11.  * 
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  * 
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this software; see the file COPYING.  If not, write to
  19.  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  20.  * Boston, MA 02111-1307 USA
  21.  *
  22.  * As a special exception, the Free Software Foundation gives permission
  23.  * for additional uses of the text contained in its release of GUILE.
  24.  *
  25.  * The exception is that, if you link the GUILE library with other files
  26.  * to produce an executable, this does not by itself cause the
  27.  * resulting executable to be covered by the GNU General Public License.
  28.  * Your use of that executable is in no way restricted on account of
  29.  * linking the GUILE library code into it.
  30.  *
  31.  * This exception does not however invalidate any other reasons why
  32.  * the executable file might be covered by the GNU General Public License.
  33.  *
  34.  * This exception applies only to the code released by the
  35.  * Free Software Foundation under the name GUILE.  If you copy
  36.  * code from other Free Software Foundation releases into a copy of
  37.  * GUILE, as the General Public License permits, the exception does
  38.  * not apply to the code that you add in this way.  To avoid misleading
  39.  * anyone as to the status of such modified files, you must delete
  40.  * this exception notice from them.
  41.  *
  42.  * If you write modifications of your own for GUILE, it is your choice
  43.  * whether to permit this exception to apply to your modifications.
  44.  * If you do not wish that, delete this exception notice.  */
  45.  
  46.  
  47.  
  48. #include "libguile/__scm.h"
  49.  
  50.  
  51. /*
  52.  * A plugin interface for RNGs
  53.  *
  54.  * Using this interface, it is possible for the application to tell
  55.  * libguile to use a different RNG.  This is desirable if it is
  56.  * necessary to use the same RNG everywhere in the application in
  57.  * order to prevent interference, if the application uses RNG
  58.  * hardware, or if the application has special demands on the RNG.
  59.  *
  60.  * Look how the default generator is "plugged in" in scm_init_random().
  61.  */
  62.  
  63. typedef struct scm_t_rstate {
  64.   int reserved0;
  65.   double reserved1;
  66.   /* Custom fields follow here */
  67. } scm_t_rstate;
  68.  
  69. typedef struct scm_t_rng {
  70.   size_t rstate_size;                    /* size of random state */
  71.   unsigned long (*random_bits) (scm_t_rstate *state); /* gives 32 random bits */
  72.   void (*init_rstate) (scm_t_rstate *state, char *seed, int n);
  73.   scm_t_rstate *(*copy_rstate) (scm_t_rstate *state);
  74. } scm_t_rng;
  75.  
  76. extern scm_t_rng scm_the_rng;
  77.  
  78.  
  79. /*
  80.  * Default RNG
  81.  */
  82. typedef struct scm_t_i_rstate {
  83.   scm_t_rstate rstate;
  84.   unsigned long w;
  85.   unsigned long c;
  86. } scm_t_i_rstate;
  87.  
  88. #if (SCM_DEBUG_DEPRECATED == 0)
  89. # define scm_rstate scm_t_rstate
  90. # define scm_rng scm_t_rng
  91. # define scm_i_rstate scm_t_i_rstate
  92. #endif
  93.  
  94. extern unsigned long scm_i_uniform32 (scm_t_i_rstate *);
  95. extern void scm_i_init_rstate (scm_t_i_rstate *, char *seed, int n);
  96. extern scm_t_i_rstate *scm_i_copy_rstate (scm_t_i_rstate *);
  97.  
  98.  
  99. /*
  100.  * Random number library functions
  101.  */
  102. extern scm_t_rstate *scm_c_make_rstate (char *, int);
  103. extern scm_t_rstate *scm_c_default_rstate (void);
  104. #define scm_c_uniform32(RSTATE) scm_the_rng.random_bits (RSTATE)
  105. extern double scm_c_uniform01 (scm_t_rstate *);
  106. extern double scm_c_normal01 (scm_t_rstate *);
  107. extern double scm_c_exp1 (scm_t_rstate *);
  108. extern unsigned long scm_c_random (scm_t_rstate *, unsigned long m);
  109. extern SCM scm_c_random_bignum (scm_t_rstate *, SCM m);
  110.  
  111.  
  112. /*
  113.  * Scheme level interface
  114.  */
  115. extern scm_t_bits scm_tc16_rstate;
  116. #define SCM_RSTATEP(obj) SCM_TYP16_PREDICATE (scm_tc16_rstate, obj)
  117. #define SCM_RSTATE(obj)  ((scm_t_rstate *) SCM_CELL_WORD_1 (obj))
  118.  
  119. extern unsigned char scm_masktab[256];
  120.  
  121. extern SCM scm_var_random_state;
  122. extern SCM scm_random (SCM n, SCM state);
  123. extern SCM scm_copy_random_state (SCM state);
  124. extern SCM scm_seed_to_random_state (SCM seed);
  125. extern SCM scm_random_uniform (SCM state);
  126. extern SCM scm_random_solid_sphere_x (SCM v, SCM state);
  127. extern SCM scm_random_hollow_sphere_x (SCM v, SCM state);
  128. extern SCM scm_random_normal (SCM state);
  129. extern SCM scm_random_normal_vector_x (SCM v, SCM state);
  130. extern SCM scm_random_exp (SCM state);
  131. extern void scm_init_random (void);
  132.  
  133. #endif  /* RANDOMH */
  134.  
  135. /*
  136.   Local Variables:
  137.   c-file-style: "gnu"
  138.   End:
  139. */
  140.